package com.gosophia.commons.web.bean;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.json.JSONException;
import org.apache.struts2.json.JSONUtil;
import org.apache.struts2.json.annotations.JSON;

import freemarker.template.utility.StringUtil;

/**
 * 
 * 功能：      
 * 页面js使用request.getAttribute()获取actionBean时，
 * 会自动调用toString方法，本类提供将自身转换成JSON对象的toString方法
 * @author renxuehui
 * @since  2010-9-19
 *  Copyright (c) 2010 Gosophia corporation All Rights Reserved
 */
public class BaseJsonObject {

    /**
     * 将自身转换成JSON对象的toString方法
     */
    @Override
    public String toString() {
        StringBuilder strB = new StringBuilder();

        strB.append("{");
        
        /**
         * 转换父类本身含有的属性，直到父类是BaseJsonObject为止
         */
        if (!this.getClass().getSuperclass().getSimpleName().equals("BaseJsonObject")){
            strB.append(getMethodJsonString(this.getClass().getSuperclass().getDeclaredMethods()));
        }
        
        /**
         * 转换子类本身含有的属性
         */
        strB.append(getMethodJsonString(this.getClass().getDeclaredMethods()));
        
        if (!strB.toString().equals("{")){
        	strB.deleteCharAt(strB.lastIndexOf(","));
        }
        strB.append("}");

        return strB.toString();
    }
    
    /**
     * 把所有get方法转换成JSON对象的toString方法
     * @param methods
     * @return
     */
    private String getMethodJsonString(Method[] methods){
        StringBuilder strB = new StringBuilder();
        
        //把所有get方法转换成JSON对象的toString方法
        for (Method m : methods) {
        	
        	//---start--由原来的：查找get方法，修改为：查找返回类型不是void的方法-----2011/01/05-------
        	//如果方法不是get开头，不纳入toString范围 
            //if (m.getName().indexOf("get") != 0) continue;
            
        	//如果方法返回类型是void 或者 方法要提供输入参数，不纳入toString范围 
            if (m.getReturnType().getName().equals("void") 
            		|| m.getParameterTypes().length > 0) continue;
            //---end----由原来的：查找get方法，修改为：查找返回类型不是void的方法-----2011/01/05-------
            
            try {
                String fName  = "";
                String fValue = "null";
                
                Object value = m.invoke(this);
                
                if (value != null){
                	fValue = (value instanceof String)? 
                			"'" + value + "'" : "'" + value.toString() +"'";//JSONUtil.serialize(value);
                }else{
                	continue;
                }
                
                if (m.isAnnotationPresent(JSON.class)){     //有JSON标注的，按标注指定的名称转换
                    fName = m.getAnnotation(JSON.class).name();
                }else if (m.getName().indexOf("get") == 0){ //以get开头的去掉get
                    fName = StringUtils.substringAfter(m.getName(), "get");
                    //属性的第一个字母小写
                    fName = fName.substring(0, 1).toLowerCase() + fName.substring(1);
                }else{                                      //其它不已get开头的，首字母变小写
                	fName = m.getName();
                	//属性的第一个字母小写
                    fName = fName.substring(0, 1).toLowerCase() + fName.substring(1);
                }
                //toString 格式：（ 属性名：属性值）
                strB.append(fName).append(":").append(fValue).append(",");
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } //catch (JSONException e) {
//                e.printStackTrace();
//            }
        }
        return strB.toString();
    }
}
